/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package graf;

import java.util.ArrayList;

/**
 *
 * @author sufka
 */
public class WierzcholkoweAlgorytm implements Pokrycie{

    Graf graf;
    public WierzcholkoweAlgorytm(Graf graf){
        this.graf = graf;
    }

    public ArrayList<Sciezka> tworzPokrycie(){
        ArrayList<Sciezka> zbiorSciezek = new ArrayList<Sciezka>();
        Wierzcholek w;
        //wywlouje na wszystkich poczatkowych wierzcholkach metode pokrywaj
        //oczywiscie, jesli tylko nie zostaly wczesniej odwiedzone
        for(int i = 0; i < graf.getPoczatkowe().size(); ++i){         
            w = graf.getPoczatkowe().get(i);
            if(!w.isOdwiedzony()){
                Sciezka s = new Sciezka();
                s.dodajNaKoniec(w);
                w.setOdwiedzony(true);
                zbiorSciezek.add(s);
                zbiorSciezek = pokrywaj(zbiorSciezek, w);
            }
        }
        
        //teraz dokladam falszywa sciezke do zbioru z wierzcholkiem o numerze -1
        Sciezka s2 = new Sciezka();
        Wierzcholek w2 = new Wierzcholek();
        w2.setNumer(-1);
        s2.dodajNaKoniec(w2);
        zbiorSciezek.add(s2);
        //i przegladam jeszcze raz wszystkie wierzcholki, czy zostaly przegladaniete
        
        int ileNieodwiedzonych = 0;
        for(int i = 0; i < graf.getWierzcholki().size(); ++i){
            Wierzcholek w1 = graf.getWierzcholki().get(i);
            if(!w1.isOdwiedzony()){
                Sciezka s3 = new Sciezka();
                s3.dodajNaKoniec(w1);
                zbiorSciezek.add(s3);
                ileNieodwiedzonych++;
            }
        }

        //i na koncu dokladam jeszcze jedna sciezke, ktora bedzie zawierala inforamacje ile
        //wierzcholkow zostalo nie odwiedzonych
        Sciezka s4 = new Sciezka();
        Wierzcholek w4 = new Wierzcholek();
        w4.setNumer(ileNieodwiedzonych);
        s4.dodajNaKoniec(w4);
        zbiorSciezek.add(s4);

        //taki zbiorsciezek zawiera wszystkie wierzcholki spelniajace pokrycie wierzcholkowe (na poczatku)
        // oraz informacje o wierzcholkach, ktore nie zostaly pokryte (na koncu)
        //te dwie grupy zostaly oddzielone sciezka zawierajaca wierzcholek o numerze -1
        //na kocu jest wierzcholek o numerze bedeacym liczba wierzcholkow nieodwiedzonych

        graf.odswiezWierzcholki();
        return zbiorSciezek;
    }

    public ArrayList<Sciezka> pokrywaj(ArrayList<Sciezka> zbior, Wierzcholek w){
        Wierzcholek wTemp;
        for(int i = 0; i < w.getSasiedzi().size(); ++i){
            wTemp = w.getSasiedzi().get(i).getWierzcholek();
            if( !wTemp.isOdwiedzony()){
                wTemp.setOdwiedzony(true);
                Sciezka s = new Sciezka();
                s.dodajNaKoniec(wTemp);
                zbior.add(s);
                zbior = pokrywaj(zbior, wTemp);
            }
        }
        return zbior;
    }

}
